我們第三天也來解釋Lstm用於天氣預測的部分,以下是程式碼
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 讀取數據
data = pd.read_csv('weather.csv')
data = data['temperature'].values
data = data.reshape(-1, 1)
# 正規化數據
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# 設定時間步長和創建訓練數據
def create_dataset(dataset, time_step=1):
X, Y = [], []
for i in range(len(dataset) - time_step - 1):
a = dataset[i:(i + time_step), 0]
X.append(a)
Y.append(dataset[i + time_step, 0])
return np.array(X), np.array(Y)
time_step = 100
X, Y = create_dataset(scaled_data, time_step)
# 重塑數據以適應 LSTM
X = X.reshape(X.shape[0], X.shape[1], 1)
# 建立 LSTM 模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
# 訓練模型
model.fit(X, Y, epochs=20, batch_size=32, verbose=1)
# 預測未來數據
test_data = scaled_data[-time_step:]
test_data = test_data.reshape(1, time_step, 1)
prediction = model.predict(test_data)
prediction = scaler.inverse_transform(prediction)
print("預測的溫度值: ", prediction)
讀取數據
data = pd.read_csv('weather.csv')
data = data['temperature'].values
data = data.reshape(-1, 1)
這段程式碼從 CSV 文件中讀取溫度數據,並將其轉換成 NumPy 陣列,方便後續處理。
正規化數據
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
為了使模型訓練更穩定,我們使用 MinMaxScaler
將數據正規化到 0 和 1 之間。
def create_dataset(dataset, time_step=1):
X, Y = [], []
for i in range(len(dataset) - time_step - 1):
a = dataset[i:(i + time_step), 0]
X.append(a)
Y.append(dataset[i + time_step, 0])
return np.array(X), np.array(Y)
time_step = 100
X, Y = create_dataset(scaled_data, time_step)
我們創建一個函數 create_dataset
來生成訓練數據集。該函數根據給定的 time_step
(在此例中為 100)將數據拆分成輸入 X 和目標輸出 Y。X = X.reshape(X.shape[0], X.shape[1], 1)
為了適應 LSTM 模型,我們需要將數據重塑為三維陣列,形狀為 (樣本數, 時間步長, 特徵數)
。建立模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
我們使用 Keras 庫來建立一個 LSTM 模型。模型包括兩層 LSTM,每層有 50 個單元。第一層的 return_sequences=True
表示返回完整的序列,第二層則只返回最後一個輸出。最後一層是 Dense 層,用於生成最終預測值。模型使用均方誤差(MSE)作為損失函數,Adam 作為優化器。
訓練模型
model.fit(X, Y, epochs=20, batch_size=32, verbose=1)
使用訓練數據 X
和 Y
訓練模型,訓練 20 個 epochs,每個批次大小為 32。
test_data = scaled_data[-time_step:]
test_data = test_data.reshape(1, time_step, 1)
prediction = model.predict(test_data)
prediction = scaler.inverse_transform(prediction)
print("預測的溫度值: ", prediction)
我們使用最後 100 天(time_step) 的數據作為測試數據,重塑為適合 LSTM 模型的三維陣列。模型預測的結果是正規化數據,需要反轉正規化以獲得實際溫度值。這段程式碼展示了如何使用 LSTM 模型進行天氣預測。首先,我們對數據進行預處理和正規化,然後創建適合 LSTM 模型的訓練數據集。接下來,我們建立並訓練 LSTM 模型,最後使用模型對未來的溫度進行預測。這種方法可以應用於其他時間序列預測問題,只需調整輸入數據和模型參數即可。